クライアントVPNエンドポイント作成時に Please ensure that you have the iam:CreateServiceLinkedRole permission configure for your user/role エラーが発生する時の対処方法
困っていた内容
IAMポリシーの"aws:SourceIp"
条件キーで送信元IPを指定しリクエストを制限しています。
操作に使用しているIAMユーザーにはAdministorator
権限が付与されており、送信元IPで接続してしていることも確認していますが、クライアントVPNエンドポイント作成時に権限が足りないとエラーが発生しています。
原因と対処方法を教えてください。
原因
アクションによってはAWSサービスが内部的に他のAWSサービス呼び出す場合があります。この場合に、"aws:SourceIp"
条件キーを使用したアクセスが拒否されて失敗します。
クライアントVPNエンドポイントの作成(CreateClientVpnEndpoint APIの実行)は、クライアントVPNサービスにより内部的に他のAWSサービスの呼び出しが発生するため、"aws:SourceIp"
条件キーにより実行権限を制限している場合に、クライアントVPNエンドポイント作成時にエラーとなります。
対応方法
IAMポリシーで下記のように"aws:ViaAWSService"
を使用します。
{ "Version": "2012-10-17", "Statement": { "Effect": "Deny", "Action": "*", "Resource": "*", "Condition": { "NotIpAddress": { "aws:SourceIp": [ "*.*.*.*/32", "*.*.*.*/32" ] }, "Bool": {"aws:ViaAWSService": "false"} } } }
"aws:ViaAWSService"
は、AWSサービスがユーザーに代わってリクエストを実行しているかどうかを確認する条件キーです。
上記ポリシーは"aws:SourceIp"
で指定した送信元IPの場合に許可しつつ、AWSサービスが呼び出しを行う場合には許可するポリシーとなっています。
aws:ViaAWSService
ブール演算子で動作します。 このキーを使用して、AWS サービスがユーザーに代わって別のサービスにリクエストを実行するかどうか確認します。
サービスが IAM プリンシパルの認証情報を使用し、プリンシパルに代わってリクエストを実行すると、リクエストコンテキストキーは true を返します。サービスがサービスロールまたはサービスリンクロールを使用してプリンシパルに代わって呼び出しを行う場合、コンテキストキーは false を返します。リクエストコンテキストキーは、プリンシパルが直接呼び出しを行ったときも false を返します。
- 可用性 – このキーは常にリクエストコンテキストに含まれます。
- 値タイプ — 単一値
この条件キーを使用して、リクエストがサービスによって行われたかどうかに基づいてアクセスを許可または拒否できます。ポリシーの例を表示するには、「AWS: 送信元 IP に基づいて AWS へのアクセスを拒否する」を参照してください。
引用元: aws:ViaAWSService - AWS Identity and Access Management
試してみた
コンソールにてクライアントVPNエンドポイント作成を試してみたところ、下記のエラーが発生しました。
There was an error creating your client VPN endpoint User: arn:aws:iam::accout-id:user/user-name is not authorized to perform kms:DescribeKey on resource arn:aws:kms:ca-central-1:accout-id:key/***. Grant arn:aws:iam::accout-id:user/user-name permission to perform action kms:DescribeKey by modifying the IAM policy and try again. (Service: AWSQuickbeamAdmin; Status Code: 400; Error Code: AccessDeniedException; Request ID: 2484e7d2-0c4e-4f10-9ac7-002638914aac; Proxy: null)
権限エラーであることは同じなのですが、ここでなぜタイトルとは違う別の権限が足りないとエラーが発生したか確認したところ、私がクライアントVPNエンドポイントを作成する時に、認証のため相互認証を使用したため、ACM用のAWSマネージド型キーaws/acm
にリクエストしたためであることが分かりました。
IAMポリシーに"Bool": {"aws:ViaAWSService": "false"}
を追加したところ問題なく作成できました。
CloudTrailを確認したところ、最初にCreateClientVpnEndpoint
に失敗しています。(赤枠の部分)
ポリシー修正後はCreateGrant
とCreateClientVpnEndpoint
に成功していることを確認しました。
以下は上のスクリーンショットの赤枠の記録の詳細です。ここでエラーが発生していることを確認しました。
まとめ
この記事を書いている途中で以下のテクサポブログを発見しました。この記事で"aws:SourceIp"
と"Bool": {"aws:ViaAWSService": "false"}
を使用したポリシーの読み方等を分かりやすく説明しているのでこちらもご参考ください。